#include "socket.h"

//  ./client server_ip server_port

void Reciever(int sockfd)
{
    while(1)
    {
        // 收数据
        struct sockaddr_in foreign; // 客户端的套接字信息(输入输出型参数)
        socklen_t len = sizeof(foreign);
        char buffer[1024]={0};
        recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (sockaddr *)&foreign, &len);
        cout<<"client recieve: "<<buffer<<endl;
    }
}
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        cerr << "erro input,please in:xxx ip port" << endl;
        exit(-1);
    }

    string ip = argv[1];
    uint16_t port = stoi(argv[2]);

     // 1.创建套接字(创建文件细节)
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建套接字(域、套接字类型、协议)参数2基本可以固定tcp/udp
    if (sockfd < 0)
    {
        cerr << "创建套接字失败" << endl;
        exit(-1);
    }
    // 不需要调用bind函数绑定客户端的ip+port,在首次发送数据时会默认自动绑定
    // 客户端ip是由自己端决定，端口必须随机

    thread t1(Reciever,sockfd);

    while (1)
    {
        // 发数据
        string tmp;
        cout << "please input:";
        getline(cin, tmp);
        // getchar();
        struct sockaddr_in sv;
        sv.sin_family = AF_INET;                     // 域，用于sockaddr类型接收时的辨别字段
        sv.sin_port = htons(port);                  // 端口号 主机转网络(用于发送)
        sv.sin_addr.s_addr = inet_addr(ip.c_str()); // 四字节ip+转换成网络序列
        size_t n = sendto(sockfd, tmp.c_str(), tmp.size(), 0, (sockaddr *)&sv, sizeof(sv));
    }
    

    return 0;
}